home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / libimage / rle.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  5.0 KB  |  195 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *    img_getrowsize, img_setrowsize, img_rle_compact, img_rle_expand -
  19.  *
  20.  *                Paul Haeberli - 1984
  21.  *
  22.  */
  23. #include    <stdio.h>
  24. #include    "image.h"
  25.  
  26. img_getrowsize(image)
  27. register IMAGE *image;
  28. {
  29.     switch(image->dim) {
  30.     case 1:
  31.         return image->rowsize[0];
  32.     case 2:
  33.         return image->rowsize[image->y];
  34.     case 3:
  35.         return image->rowsize[image->y+image->z*image->ysize];
  36.     }
  37. }
  38.  
  39. img_setrowsize(image,cnt,y,z)
  40. register IMAGE *image;
  41. long y, z, cnt;
  42. {
  43.     long *sizeptr;
  44.  
  45.     if(img_badrow(image,y,z)) 
  46.     return;
  47.     switch(image->dim) {
  48.     case 1:
  49.         sizeptr = &image->rowsize[0];
  50.         image->rowstart[0] = image->rleend;
  51.         break;
  52.     case 2:
  53.         sizeptr = &image->rowsize[y];
  54.         image->rowstart[y] = image->rleend;
  55.         break;
  56.     case 3:
  57.         sizeptr = &image->rowsize[y+z*image->ysize];
  58.         image->rowstart[y+z*image->ysize] = image->rleend;
  59.     }    
  60.     if(*sizeptr != -1) 
  61.     image->wastebytes += *sizeptr;
  62.     *sizeptr = cnt;
  63.     image->rleend += cnt;
  64. }
  65.  
  66. #define docompact                             \
  67.     while(iptr<ibufend) {                        \
  68.         sptr = iptr;                        \
  69.         iptr += 2;                            \
  70.         while((iptr<ibufend)&&((iptr[-2]!=iptr[-1])||(iptr[-1]!=iptr[0])))\
  71.         iptr++;                            \
  72.         iptr -= 2;                            \
  73.         count = iptr-sptr;                        \
  74.         while(count) {                        \
  75.         todo = count>126 ? 126:count;                 \
  76.         count -= todo;                        \
  77.         *optr++ = 0x80|todo;                    \
  78.         while(todo--)                        \
  79.             *optr++ = *sptr++;                    \
  80.         }                                \
  81.         sptr = iptr;                        \
  82.         cc = *iptr++;                        \
  83.         while( (iptr<ibufend) && (*iptr == cc) )            \
  84.         iptr++;                            \
  85.         count = iptr-sptr;                        \
  86.         while(count) {                        \
  87.         todo = count>126 ? 126:count;                 \
  88.         count -= todo;                        \
  89.         *optr++ = todo;                        \
  90.         *optr++ = cc;                        \
  91.         }                                \
  92.     }                                \
  93.     *optr++ = 0;
  94.  
  95. img_rle_compact(expbuf,ibpp,rlebuf,obpp,cnt)
  96. unsigned short *expbuf;
  97. int ibpp;
  98. unsigned short *rlebuf;
  99. int obpp, cnt;
  100. {
  101.     if(ibpp == 1 && obpp == 1) {
  102.     register unsigned char *iptr = (unsigned char *)expbuf;
  103.     register unsigned char *ibufend = iptr+cnt;
  104.     register unsigned char *sptr;
  105.     register unsigned char *optr = (unsigned char *)rlebuf;
  106.     register short todo, cc;
  107.     register long count;
  108.  
  109.     docompact;
  110.     return optr - (unsigned char *)rlebuf;
  111.     } else if(ibpp == 1 && obpp == 2) {
  112.     register unsigned char *iptr = (unsigned char *)expbuf;
  113.     register unsigned char *ibufend = iptr+cnt;
  114.     register unsigned char *sptr;
  115.     register unsigned short *optr = rlebuf;
  116.     register short todo, cc;
  117.     register long count;
  118.  
  119.     docompact;
  120.     return optr - rlebuf;
  121.     } else if(ibpp == 2 && obpp == 1) {
  122.     register unsigned short *iptr = expbuf;
  123.     register unsigned short *ibufend = iptr+cnt;
  124.     register unsigned short *sptr;
  125.     register unsigned char *optr = (unsigned char *)rlebuf;
  126.     register short todo, cc;
  127.     register long count;
  128.  
  129.     docompact;
  130.     return optr - (unsigned char *)rlebuf;
  131.     } else if(ibpp == 2 && obpp == 2) {
  132.     register unsigned short *iptr = expbuf;
  133.     register unsigned short *ibufend = iptr+cnt;
  134.     register unsigned short *sptr;
  135.     register unsigned short *optr = rlebuf;
  136.     register short todo, cc;
  137.     register long count;
  138.  
  139.     docompact;
  140.     return optr - rlebuf;
  141.     } else  {
  142.     i_errhdlr("rle_compact: bad bpp: %d %d\n",ibpp,obpp);
  143.     return 0;
  144.     }
  145. }
  146.  
  147. #define doexpand                \
  148.     while(1) {                \
  149.         pixel = *iptr++;            \
  150.         if ( !(count = (pixel & 0x7f)) )    \
  151.         return;                \
  152.         if(pixel & 0x80) {            \
  153.            while(count--)            \
  154.             *optr++ = *iptr++;        \
  155.         } else {                \
  156.            pixel = *iptr++;            \
  157.            while(count--)            \
  158.             *optr++ = pixel;        \
  159.         }                    \
  160.     }
  161.  
  162. img_rle_expand(rlebuf,ibpp,expbuf,obpp)
  163. unsigned short *rlebuf;
  164. int ibpp;
  165. unsigned short *expbuf;
  166. int obpp;
  167. {
  168.     if(ibpp == 1 && obpp == 1) {
  169.     register unsigned char *iptr = (unsigned char *)rlebuf;
  170.     register unsigned char *optr = (unsigned char *)expbuf;
  171.     register unsigned short pixel,count;
  172.  
  173.     doexpand;
  174.     } else if(ibpp == 1 && obpp == 2) {
  175.     register unsigned char *iptr = (unsigned char *)rlebuf;
  176.     register unsigned short *optr = expbuf;
  177.     register unsigned short pixel,count;
  178.  
  179.     doexpand;
  180.     } else if(ibpp == 2 && obpp == 1) {
  181.     register unsigned short *iptr = rlebuf;
  182.     register unsigned char  *optr = (unsigned char *)expbuf;
  183.     register unsigned short pixel,count;
  184.  
  185.     doexpand;
  186.     } else if(ibpp == 2 && obpp == 2) {
  187.     register unsigned short *iptr = rlebuf;
  188.     register unsigned short *optr = expbuf;
  189.     register unsigned short pixel,count;
  190.  
  191.     doexpand;
  192.     } else 
  193.     i_errhdlr("rle_expand: bad bpp: %d %d\n",ibpp,obpp);
  194. }
  195.